package reflection;

import reflectionbean.User;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 *通过反射API动态的操作:构造器/方法/属性
 */
public class Demo03 {
    public static void main(String[] args) {
        String path="reflectionbean.User";
        try {
            Class clazz=Class.forName(path);
            //动态操作构造器
            //通过反射API调用构造方法,构造对象
            User u= (User)clazz.newInstance();//其实是调用了User的无参构造
            System.out.println(u);

            //指定带参构造
            //通过反射API获取User类的全部信息
            Constructor<User> c2=clazz.getDeclaredConstructor(int.class,int.class,String.class);
            User u2=c2.newInstance(001,18,"张三");//实例化对象
            System.out.println(u2.getUname());
            //通过反射API调用普通方法
            //指定无参构造
            Constructor<User> c=clazz.getDeclaredConstructor(null);
            User u3=c.newInstance();//通过无参构造实例化对象
            //u3.setUname("李四");//相当于下面两行代码
            Method method=clazz.getDeclaredMethod("setUname", String.class);
            method.invoke(u3,"李四");//激活并传参
            System.out.println(u3.getUname());
            //通过反射API操作属性
            Constructor<User> c4=clazz.getDeclaredConstructor(null);
            User u4=c4.newInstance();//通过无参构造实例化对象
            Field f=clazz.getDeclaredField("uname");
            System.out.println(f);
            //禁止安全检查,可以提高运行速度,大概提高4倍
            f.setAccessible(true);//禁止安全检查无论private还是public都可以访问
            f.set(u4,"王二");     //通过反射直接写属性
            System.out.println(u4.getUname());
            System.out.println(f.get(u4));//通过反射直接读属性的值
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
